经常碰到远程服务器或很多网页上的文件只能看,不能下载的情况,发现有的同事一页一页的截图,而有的文件动不动就几百页,截到吐血。找了一下相关的库,写了一个脚本,可以实现自动翻页,翻页之后自动截图,虽然很粗糙,但工作的很好,给了很多同事使用。
基本的过程就是通过调用Window API
发送鼠标或者键盘消息,控制PDF
文件或者网页翻页,然后依次截图保存。这里发送的消息包括鼠标滚轮滚动或者鼠标点击消息,分别用于滚轮翻页和点击特定按钮翻页的情况。为实现鼠标或键盘控制程序的运行,使用了pyHook
监听鼠标或键盘消息。
使用的库包括:pywin32
、pyhook
、PIL
。
使用过程为:
代码如下:
1531# -*- coding: utf-8 -*-
2import pyHook
3import time
4import win32api
5import win32con
6import os
7from PIL import ImageGrab
8from PIL import ImageChops
9import Image
10import pythoncom
11
12getRectStarted =False
13captureStarted=False
14RightDown=False
15MouseMoved=False
16mouseClickedTimes=0
17mouseClickLocation1=(0,0)
18mouseClickLocation2=(0,0)
19captureStep=1
20def OnMouseLeftDownEvent(event):
21 global mouseClickedTimes,mouseClickLocation1,mouseClickLocation2
22 if getRectStarted:
23 if mouseClickedTimes==0:
24 mouseClickedTimes=1
25 mouseClickLocation1=event.Position
26 else:
27 mouseClickedTimes=0
28 mouseClickLocation2=event.Position
29 return False
30 return True
31def OnMouseLeftUpEvent(event):
32 pass
33 return True
34def OnMouseRightDownEvent(event):
35 global RightDown
36 RightDown=True
37 return False
38def OnMouseRightUpEvent(event):
39 global getRectStarted,mouseClickedTimes,mouseClickLocation1,mouseClickLocation2,RightDown
40 getRectStarted=True
41 mouseClickedTimes=0
42 mouseClickLocation1=(0,0)
43 mouseClickLocation2=(0,0)
44 RightDown=False
45 print u'两次单击左键选择矩形截取区域...'
46 return False
47def OnMouseMiddleDownEvent(event):
48 global captureStarted
49 hm.UnhookMouse()
50 win32api.PostQuitMessage()
51 captureStarted=True
52 return False
53def OnMouseMoveEvent(event):
54 global RightDown
55 if RightDown:
56 hm.UnhookMouse()
57 win32api.PostQuitMessage()
58 RightDown=False
59 return True
60
61# create the hook mananger
62hm = pyHook.HookManager()
63# register callbacks
64hm.MouseLeftDown = OnMouseLeftDownEvent
65hm.MouseRightDown = OnMouseRightDownEvent
66hm.MouseRightUp = OnMouseRightUpEvent
67hm.MouseMiddleDown = OnMouseMiddleDownEvent
68hm.MouseMove = OnMouseMoveEvent
69
70hm.HookMouse()
71##hm.HookKeyboard()
72def GetRect():
73 global mouseClickLocation2,mouseClickLocation1
74 if mouseClickLocation1==(0,0) and mouseClickLocation2==(0,0):
75 mouseClickLocation2=(500,500)
76 left=min(mouseClickLocation1[0],mouseClickLocation2[0])
77 right=max(mouseClickLocation1[0],mouseClickLocation2[0])
78 up=min(mouseClickLocation1[1],mouseClickLocation2[1])
79 down=max(mouseClickLocation1[1],mouseClickLocation2[1])
80 return (left,up,right,down)
81
82def GetPath():
83 pathn=os.path.abspath('.')
84 i=1
85 while 1:
86 path=pathn+'\\Captures%s\\' %i
87 if not os.path.exists(path):
88 os.mkdir(path)
89 return path
90 break
91 else:
92 i=i+1
93
94def CaptureByWheel():
95 if not captureStarted:
96 return
97 bbox=GetRect()
98 savedPath=GetPath()
99 i=1
100 im=ImageGrab.grab(bbox)
101 im.save(savedPath+'capture%s.png' %i,'png')
102 while 1:
103 i=i+1
104 win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL,0,0,-120)
105 time.sleep(captureStep)
106 im_temp=im
107 im=ImageGrab.grab(bbox)
108 diff=ImageChops.difference(im_temp,im)
109 if diff.getbbox() is None:
110 print 'caption done!'
111 return
112 else:
113 im.save(savedPath+'capture%s.png' %i,'png')
114
115def captureByClick():
116 if not captureStarted:
117 return
118 bbox=GetRect()
119 savedPath=GetPath()
120 i=1
121 im=ImageGrab.grab(bbox)
122 im.save(savedPath+'capture%s.png' %i,'png')
123 while 1:
124 i=i+1
125 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0)
126 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0)
127 time.sleep(captureStep)
128 im_temp=im
129 im=ImageGrab.grab(bbox)
130 diff=ImageChops.difference(im_temp,im)
131 if diff.getbbox() is None:
132 print 'caption done!'
133 return
134 else:
135 im.save(savedPath+'capture%s.png' %i,'png')
136
137def turnblack(ref):
138 if savedPath=='':
139 return
140 print 'turning...'
141 pngs=[os.path.join(savedPath,x) for x in os.listdir(savedPath) if os.path.isfile(os.path.join(savedPath,x)) and os.path.splitext(x)[1]=='.png']
142 for png in pngs:
143 im=Image.open(png)
144 im=im.point(lambda x:255 if x>ref else 0)
145 im=im.convert("1")
146 im.save(png,'png')
147
148if __name__ == '__main__':
149 print u'单击右键选取截取区域...'
150 pythoncom.PumpMessages()
151 capture3()
152 exit()
153## turnblack(200)